/** JSON.stringify(value[, replacer [, space]])*/
//https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
/*
JSON.stringify() 方法将一个 JavaScript 值（对象或者数组）转换为一个 JSON 字符串，

如果指定了 replacer 是一个函数，则可以选择性地替换值，

或者如果指定了 replacer 是一个数组，则可选择性地仅包含数组指定的属性。

value
    将要序列化成 一个 JSON 字符串的值。
replacer 可选
    如果该参数是一个函数，则在序列化过程中，被序列化的值的每个属性都会经过该函数的转换和处理；如果该参数是一个数组，则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中；如果该参数为 null 或者未提供，则对象所有的属性都会被序列化；关于该参数更详细的解释和示例，请参考使用原生的 JSON 对象一文。
space 可选
    指定缩进用的空白字符串，用于美化输出（pretty-print）；如果参数是个数字，它代表有多少的空格；上限为10。该值若小于1，则意味着没有空格；如果该参数为字符串（当字符串长度超过10个字母，取其前10个字母），该字符串将被作为空格；如果该参数没有提供（或者为 null），将没有空格。
*/
let x = {
  name: 'ahhh'
  , b: 2
};

console.log(JSON.stringify(x)/*json序列化*/);
console.log('-----------------------------');
/*
{"name":"ahhh","b":2} //←json

和对象是有区别的
1. key都带上了双引号
2. 原来单引号的字符串值变成了被双引号包裹
   json是不存在单引号的
3. 这整个({"name":"ahhh","b":2})其实是一个字符串
*/


let y = {
  name: 'ahhh'
  , b: 2
  , toJSON: function () {
    return {
      name1: 'ahhh2'
    }
  }
};
console.log(JSON.stringify(y));
console.log('-----------------------------');

/*
{"name1":"ahhh2"}

如果存在toJSON这个属性
调用JSON.stringify处理这个对象时
结果就不在是原本的对象了,而是toJSON这个函数返回的结果
*/


//JSON.stringify第二个参数
/** 第二个参数是个数组时,就是要选择显示的字段*/
console.log(JSON.stringify(x, ['name'])); //{"name":"ahhh"}
console.log('-----------------------------');

/** 第二个参数是个fn时,表现行为比较怪异, 推荐使用在要stringify的对象里添加toJSON属性来替代这种方式*/
let z = {
  "a":1,
  "b":2,
  "c":'3'
}
const fn = function(key,value){
  console.log('replacer----------');
  console.log('key:',key); //第一次为 空
  console.log('value:',value); //第一次为要stringify的对象本身

  if(typeof value === 'string'){
    return undefined;
  }

  return value//←← 一般这里就写value, 然而第二次进来时 key/value 就是这个 value的第一组键值对了
}
console.log(JSON.stringify(z,fn))
console.log('-----------------------------');
